package com.base.graph;

/**
 * 419. 甲板上的战舰
 *  给你一个大小为 m x n 的矩阵 board 表示甲板，其中，每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ，返回在甲板 board 上放置的 战舰 的数量。
 *
 * 战舰 只能水平或者垂直放置在 board 上。换句话说，战舰只能按 1 x k（1 行，k 列）或 k x 1（k 行，1 列）的形状建造，其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 （即没有相邻的战舰）。
 *
 *
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/battleships-in-a-board
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @ClassName: CountBattleships
 * @Description: 深度优先
 * @author: li
 * @Date: 2021/12/18 1:49 上午
 */
public class CountBattleships {
    /**
     *  题意解读：多个点挨着就当一个点算
     * 深度优先搜索
     * @param board
     * @return
     */
    public int countBattleships(char[][] board) {
        int m = board.length;
        int n = board[0].length;
        // 图得深度优先遍历，如果多个点挨着一起
        int ans = 0;
        boolean[][] visited = new boolean[m][n];
        for(int i = 0;i<m;i++){

            for(int j =0 ;j<n;j++){
                if(!visited[i][j]&&board[i][j] == 'X'){
                    dfs(i,j,m,n,visited,board);
                    ans++;
                }

            }
        }
        return ans;
    }

    private void dfs(int i,int j,int m,int n,boolean[][] visited,char[][] board){
        if(board[i][j] == '.'||visited[i][j]){
            return;
        }
        visited[i][j] =true;
        if(i>0){
            dfs(i-1,j,m,n,visited,board);
        }
        if(j>0){
            dfs(i,j-1,m,n,visited,board);
        }
        if(i<m-1){
            dfs(i+1,j,m,n,visited,board);
        }
        if(j<n-1){
            dfs(i,j+1,m,n,visited,board);
        }
    }
}
